package com.yf.modules.system.service.api;

import com.yf.domain.security.Menu;
import com.yf.modules.security.model.dto.MenuDto;
import com.yf.model.query.MenuQueryObject;
import com.yf.modules.system.model.vo.MenuVo;
import jakarta.servlet.http.HttpServletResponse;

import java.util.List;
import java.util.Set;

/**
 * @author chentianwei
 * @date 2023/5/23 16:36
 * @description 菜单Api
 */
public interface MenuService {

    /**
     * 根据 当前登录的用户生成 当前用户的菜单信息
     * @param currentUserId 当前用户的ID号
     * @return 菜单数据
     */
    List<MenuDto> getMenusByUsername(Long currentUserId);

    /**
     * 通过 第一级获取到的MenuDto构建完整的MenuTree
     * @param menuDtoList 各级MenusDto列表
     * @return 完整的MenuTree
     */
    List<MenuDto> buildTrees(List<MenuDto> menuDtoList);

    /**
     * 通过完整的MenuTree构建最终返回的类型
     * @param menuDto 完整的MenuTree
     * @return 最终菜单
     */
    List<MenuVo> buildMenus(List<MenuDto> menuDto);

    /**
     * 添加新菜单
     * @param resource 菜单实体
     */
    void addMenu(Menu resource);

    /**
     * 修改菜单
     * @param resource 菜单实体
     */
    void update(Menu resource);

    /**
     * 删除菜单
     * @param ids 主键合集
     */
    void delete(Set<Long> ids);

    /**
     * 导出菜单
     * @param response http回应
     * @param queryObject 导出条件
     */
    void download(HttpServletResponse response, MenuQueryObject queryObject);

    /**
     * 懒加载菜单数据
     * @param pid pid
     * @return 菜单集合
     */
    List<Menu> getMenus(Long pid);

    /**
     * 获取所有子节点，包含自身ID
     * @param menuList /
     * @param menuSet /
     * @return /
     */
    Set<Menu> getChildMenus(List<Menu> menuList, Set<Menu> menuSet);

    /**
     * 获取当前用户的实体对象
     * @param userId 用户Id
     * @return menu
     */
    List<MenuDto> findByUser(Long userId);

    /**
     *
     * @param menuQueryObject 查询条件
     * @return 菜单树
     */
    List<MenuDto> queryMenu(MenuQueryObject menuQueryObject);

    /**
     * 通过Pid获取子菜单树
     * @param pid 上一级菜单Id
     * @return 子菜单树
     */
    List<Menu> getMenusTrees(Long pid);

    /**
     * 根据ID获取上级数据(编辑菜单用)
     *
     * @param ids 主键
     * @return 菜单树
     */
    List<?> getMenuSuperior(List<Long> ids);

    /**
     * 获取菜单子节点Id
     * @param id 该菜单ID
     * @return 该级菜单的子节点集合
     */
    Set<Long> getMenuChildIds(Long id);
}
